home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / atari / anm.c next >
C/C++ Source or Header  |  1990-07-23  |  6KB  |  297 lines

  1. /* @(#)anm.c    1.6 */
  2. /*
  3. **    print symbol tables for
  4. **    ACK object files
  5. **
  6. **    anm [-gopruns] [name ...]
  7. */
  8. #define    ushort    unsigned short
  9.  
  10. #include    "out.h"
  11.  
  12. #include    <stdlib.h>
  13. #include    <ctype.h>
  14. #include    <stdio.h>
  15.  
  16. int    numsort_flg;
  17. int    sectsort_flg;
  18. int    undef_flg;
  19. int    revsort_flg = 1;
  20. int    globl_flg;
  21. int    nosort_flg;
  22. int    arch_flg;
  23. int    prep_flg;
  24. struct    outhead    hbuf;
  25. struct    outsect    sbuf;
  26. FILE    *fi;
  27. long    off;
  28. long    s_base[S_MAX];    /* for specially encoded bases */
  29.  
  30. main(argc, argv)
  31. char **argv;
  32. {
  33.     int    narg;
  34.     int    compare();
  35.  
  36.     if (--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) {
  37.         argv++;
  38.         while (*++*argv) switch (**argv) {
  39.         case 'n':        /* sort numerically */
  40.             numsort_flg++;
  41.             continue;
  42.  
  43.         case 's':        /* sort in section order */
  44.             sectsort_flg++;
  45.             continue;
  46.  
  47.         case 'g':        /* globl symbols only */
  48.             globl_flg++;
  49.             continue;
  50.  
  51.         case 'u':        /* undefined symbols only */
  52.             undef_flg++;
  53.             continue;
  54.  
  55.         case 'r':        /* sort in reverse order */
  56.             revsort_flg = -1;
  57.             continue;
  58.  
  59.         case 'p':        /* don't sort -- symbol table order */
  60.             nosort_flg++;
  61.             continue;
  62.  
  63.         case 'o':        /* prepend a name to each line */
  64.             prep_flg++;
  65.             continue;
  66.  
  67.         default:        /* oops */
  68.             fprintf(stderr, "anm: invalid argument -%c\n", *argv[0]);
  69.             exit(1);
  70.         }
  71.         argc--;
  72.     }
  73.     if (argc == 0) {
  74.         argc = 1;
  75.         argv[1] = "a.out";
  76.     }
  77.     narg = argc;
  78.  
  79.     while(argc--) {
  80.         struct    outname    *nbufp = (struct outname *)NULL;
  81.         struct    outname    nbuf;
  82.         char        *cbufp;
  83.         long        fi_to_co;
  84.         long        n;
  85.         unsigned    readcount;
  86.         int        i,j;
  87.  
  88.         fi = fopen(*++argv,"r");
  89.         if (fi == (FILE *)NULL) {
  90.             fprintf(stderr, "anm: cannot open %s\n", *argv);
  91.             continue;
  92.         }
  93.  
  94.         getofmt((char *)&hbuf, SF_HEAD, fi);
  95.         if (BADMAGIC(hbuf)) {
  96.             fprintf(stderr, "anm: %s-- bad format\n", *argv);
  97.             fclose(fi);
  98.             continue;
  99.         }
  100.         if (narg > 1)
  101.             printf("\n%s:\n", *argv);
  102.  
  103.         n = hbuf.oh_nname;
  104.         if (n == 0) {
  105.             fprintf(stderr, "anm: %s-- no name list\n", *argv);
  106.             fclose(fi);
  107.             continue;
  108.         }
  109.  
  110.         if (hbuf.oh_nchar == 0) {
  111.             fprintf(stderr, "anm: %s-- no names\n", *argv);
  112.             fclose(fi);
  113.             continue;
  114.         }
  115.         if ((readcount = hbuf.oh_nchar) != hbuf.oh_nchar) {
  116.             fprintf(stderr, "anm: string area too big in %s\n", *argv);
  117.             exit(2);
  118.         }
  119.  
  120.         /* store special section bases */
  121.         if (hbuf.oh_flags & HF_8086) {
  122.             for (i=0; i<hbuf.oh_nsect; i++) {
  123.                 getofmt((char *)&sbuf, SF_SECT, fi);
  124.                 s_base[i+S_MIN] =
  125.                     (sbuf.os_base>>12) & 03777760;
  126.             }
  127.         }
  128.          
  129.         if ((cbufp = (char *)malloc(readcount)) == (char *)NULL) {
  130.             fprintf(stderr, "anm: out of memory on %s\n", *argv);
  131.             exit(2);
  132.         }
  133.         fseek(fi, OFF_CHAR(hbuf), 0);
  134.         if (fread(cbufp, 1, readcount, fi) == 0) {
  135.             fprintf(stderr, "anm: read error on %s\n", *argv);
  136.             exit(2);
  137.         }
  138.         fi_to_co = (long)cbufp - OFF_CHAR(hbuf);
  139.  
  140.         fseek(fi, OFF_NAME(hbuf), 0);
  141.         i = 0;
  142.         while (--n >= 0) {
  143.             getofmt((char *)&nbuf, SF_NAME, fi);
  144.  
  145.             if (nbuf.on_foff == 0)
  146.                 continue; /* skip entries without names */
  147.  
  148.             if (globl_flg && (nbuf.on_type&S_EXT)==0)
  149.                 continue;
  150.  
  151.             if (undef_flg
  152.                 &&
  153.                 ((nbuf.on_type&S_TYP)!=S_UND || (nbuf.on_type&S_ETC)!=0))
  154.                 continue;
  155.  
  156.             nbuf.on_mptr = (char *)(nbuf.on_foff + fi_to_co);
  157.  
  158.             /* adjust value for specially encoded bases */
  159.             if (hbuf.oh_flags & HF_8086) {
  160.                 if (((nbuf.on_type&S_ETC) == 0) ||
  161.                 ((nbuf.on_type&S_ETC) == S_SCT)) {
  162.                 j = nbuf.on_type&S_TYP;
  163.                 if ((j>=S_MIN) && (j<=S_MAX))
  164.                     nbuf.on_valu += s_base[j];
  165.                 }
  166.             }
  167.  
  168.             if (nbufp == (struct outname *)NULL)
  169.                 nbufp = (struct outname *)malloc(sizeof(struct outname));
  170.             else
  171.                 nbufp = (struct outname *)realloc(nbufp, (i+1)*sizeof(struct outname));
  172.             if (nbufp == (struct outname *)NULL) {
  173.                 fprintf(stderr, "anm: out of memory on %s\n", *argv);
  174.                 exit(2);
  175.             }
  176.             nbufp[i++] = nbuf;
  177.         }
  178.  
  179.         if (nosort_flg==0)
  180.             qsort(nbufp, i, sizeof(struct outname), compare);
  181.  
  182.         for (n=0; n<i; n++) {
  183.             char    cs1[4];
  184.             char    cs2[4];
  185.  
  186.             if (prep_flg)
  187.                 printf("%s:", *argv);
  188.  
  189.             switch(nbufp[n].on_type&S_ETC) {
  190.             case S_SCT:
  191.                 sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
  192.                 sprintf(cs2, " S");
  193.                 break;
  194.             case S_FIL:
  195.                 sprintf(cs1, " -");
  196.                 sprintf(cs2, " F");
  197.                 break;
  198.             case S_MOD:
  199.                 sprintf(cs1, " -");
  200.                 sprintf(cs2, " M");
  201.                 break;
  202.             case 0:
  203.                 if (nbufp[n].on_type&S_EXT)
  204.                     sprintf(cs2, " E");
  205.                 else
  206.                     sprintf(cs2, " -");
  207.  
  208.                 switch(nbufp[n].on_type&S_TYP) {
  209.                 case S_UND:
  210.                     sprintf(cs1, " U");
  211.                     break;
  212.                 case S_ABS:
  213.                     sprintf(cs1, " A");
  214.                     break;
  215.                 default:
  216.                     sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
  217.                 }
  218.                 break;
  219.             default:
  220.                 continue;
  221.             }
  222.  
  223.             printf("%8lx %s %s %s\n",nbufp[n].on_valu,cs1,cs2,nbufp[n].on_mptr);
  224.         }
  225.  
  226.         if (nbufp)
  227.             free((char *)nbufp);
  228.         if (cbufp)
  229.             free((char *)cbufp);
  230.         fclose(fi);
  231.     }
  232.     exit(0);
  233. }
  234.  
  235. compare(p1, p2)
  236. struct outname    *p1, *p2;
  237. {
  238.     int    i;
  239.  
  240.     if (sectsort_flg) {
  241.         if ((p1->on_type&S_TYP) > (p2->on_type&S_TYP))
  242.             return(revsort_flg);
  243.         if ((p1->on_type&S_TYP) < (p2->on_type&S_TYP))
  244.             return(-revsort_flg);
  245.     }
  246.  
  247.     if (numsort_flg) {
  248.         if (p1->on_valu > p2->on_valu)
  249.             return(revsort_flg);
  250.         if (p1->on_valu < p2->on_valu)
  251.             return(-revsort_flg);
  252.     }
  253.  
  254.     i = strcmp(p1->on_mptr, p2->on_mptr);
  255.  
  256.     if (i > 0)
  257.         return(revsort_flg);
  258.     if (i < 0)
  259.         return(-revsort_flg);
  260.  
  261.     return(0);
  262. }
  263.  
  264. getofmt(p, s, f)
  265. register char    *p;
  266. register char    *s;
  267. register FILE    *f;
  268. {
  269.     register i;
  270.     register long l;
  271.  
  272.     for (;;) {
  273.         switch (*s++) {
  274. /*        case '0': p++; continue; */
  275.         case '1':
  276.             *p++ = getc(f);
  277.             continue;
  278.         case '2':
  279.             i = getc(f);
  280.             i |= (getc(f) << 8);
  281.             *((short *)p) = i; p += sizeof(short);
  282.             continue;
  283.         case '4':
  284.             l = (long)getc(f);
  285.             l |= ((long)getc(f) << 8);
  286.             l |= ((long)getc(f) << 16);
  287.             l |= ((long)getc(f) << 24);
  288.             *((long *)p) = l; p += sizeof(long);
  289.             continue;
  290.         default:
  291.         case '\0':
  292.             break;
  293.         }
  294.         break;
  295.     }
  296. }
  297.